package com.utils;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 文件读取类
 *
 * @author xxg
 */
public class ReadFileUtil {

    /**
     * 从倒数startLength开始读取文件读N行
     * <p>
     * 根据换行符判断当前的行数，
     * 使用统计来判断当前读取第N行
     * <p>
     *
     * @param file      待文件
     * @param numRead   读取的行数
     * @param maxLength 读到maxLength为止
     *                  若读到maxLength仍未读完。。停止读
     *                  若读到numRead 未读到maxLength 停止读
     * @return Object[]  0 读取到的内容
     * 1 读取到的位置游标
     */
    public static Object[] readLastNLine(File file, long numRead, long maxLength, Long startLength) {
        Object[] result = new Object[2];
        // 定义结果集
        String s = "";
        //已读行数统计
        long count = 0;
        // 排除不可读状态
        if (!file.exists() || file.isDirectory() || !file.canRead()) {
            return null;
        }
        // 使用随机读取
        RandomAccessFile fileRead = null;
        try {
            //使用读模式
            fileRead = new RandomAccessFile(file, "r");
            //读取文件长度
            long length = fileRead.length();
            //如果是0，代表是空文件，直接返回空结果
            if (length == 0L) {
                return null;
            } else {
                //初始化游标
                long pos = startLength - 1;
                //结束标志 当结束标志true且读到指定字符时结束读取
                boolean isEnd = false;
                while (pos > 0 && pos > maxLength) {
                    pos--;
                    //开始读取
                    fileRead.seek(pos);
                    //如果读取到\n代表是读取到一行
                    if (fileRead.readByte() == '\n') {
                        //使用readLine获取当前行
                        String line = new String(fileRead.readLine().getBytes("ISO-8859-1"), "utf-8");
                        //保存结果
                        s = line + System.getProperty("line.separator") + s;
                        //行数统计，如果到达了numRead指定的行数，就跳出循环
                        count++;
                        if (count >= numRead) {
                            isEnd = true;
                        }
                        //大于指定行数且到达非空格起始的行 结束读取
                        if (line.getBytes("utf-8").length > 0) {
                            if ((isEnd && (line.getBytes("utf-8")[0] != '\t'))) {
                                break;
                            }
                        }

                    }
                }
                if (pos == 0) {
                    fileRead.seek(0);
                    s = new String(fileRead.readLine().getBytes("ISO-8859-1"), "utf-8") + System.getProperty("line.separator") + s;
                }
                result[0] = s;
                result[1] = pos;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileRead != null) {
                try {
                    //关闭资源
                    fileRead.close();
                } catch (Exception e) {
                }
            }
        }

        return result;
    }

    /**
     * 从指定位置开始读取指定长度内容
     *
     * @param file        要读取得文件
     * @param startLength 开始位置下标
     * @param readLength  要读取的长度
     * @return 读取结果
     */
    public static String getInfoByLength(File file, long startLength, long readLength) {
        // 排除不可读状态
        if (!file.exists() || file.isDirectory() || !file.canRead()) {
            return null;
        }
        // 使用随机读取
        RandomAccessFile fileRead = null;
        StringBuilder sbr=new StringBuilder();

        try {
            //使用读模式
            String readLineString = "";
            fileRead = new RandomAccessFile(file, "r");
            fileRead.seek(startLength);
            while ((readLineString = fileRead.readLine()) != null) {
                sbr.append(new String(readLineString.getBytes("ISO-8859-1"), "utf-8"));
                if (sbr.length() >= readLength) {
                    break;
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileRead != null) {
                try {
                    //关闭资源
                    fileRead.close();
                } catch (Exception e) {
                }
            }
        }
        return sbr.toString();
    }
}
